Python tkinter之PhotoImage图片显示问题 您所在的位置:网站首页 python tkinter登录界面怎么加图片 Python tkinter之PhotoImage图片显示问题

Python tkinter之PhotoImage图片显示问题

2023-08-10 15:25| 来源: 网络整理| 查看: 265

作为Python小白的你,有没有遇到过这几个问题?

PhotoImage不支持jpg等图片格式;将PhotoImage放在函数里图片不显示;循环加入图片只显示一张;

这些难倒了一大批小白,那么接下来,本文教你如何解决这些问题。 . .

【2021-09-03更】本篇内容太糟,于是写了片新文章。点击前往

. . .

为了解决PhotoImage不支持jpg等格式问题,可以使用Image+ImageTk实现多种格式图片的载入。

from PIL import Image, ImageTk img = Image.open('1.jpg') photo = ImageTk.PhotoImage(img) tk.Label(paned, image=photo).grid(row=0, column=0)

显示图片

jpg格式显示已经大功告成!心动的赶紧去试试吧! . . . 那么第一个问题解决了,来看第二个问题:

将PhotoImage放在函数里图片不显示

先上代码:

import tkinter as tk from PIL import Image, ImageTk root = tk.Tk() def load_img(): img = Image.open('1.jpg') photo = ImageTk.PhotoImage(img) tk.Label(root, image=photo).grid(row=0, column=0) load_img() root.mainloop()

运行代码,图片确实不见了,究竟是怎么回事?

其实load_img()调用结束后photo就被回收了。 我们可以将photo设为全局变量:

global photo,注意看load_img()函数第一行

photo设为全局变量 此时,运行代码已经没有问题了。

还有一种解决方法:将img和photo移到函数外面,看代码: img、photo在函数里面 将它移到外面: img、photo在函数外面

跟global一样,能显示图片了。 显示图片

可是,问题又来了!

我要是循环加入图片呢? 前面说过,load_img()调用后会回收,所以,循环时每次加入的图片都会换掉上一次的图片,即使给photo设为全局变量,它也会如此。

这就是第三个问题了:

循环加入图片只显示最后一张;

import tkinter as tk from PIL import Image, ImageTk root = tk.Tk() root.wm_geometry("530x150+500+300") root.resizable(0, 0) imgs = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg'] def load_img(index,path): global photo paned = tk.PanedWindow(root) paned.pack(fill=tk.X, side=tk.LEFT) img = Image.open(path) photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小 tk.Label(paned, image=photo).grid(row=index, column=0) for i in range(len(imgs)): load_img(i,imgs[i]) root.mainloop()

显示结果: 在这里插入图片描述

明明给了5张图片,为什么显示最后一张?怎么解决呢?

办法就是给它一个引用!也就是为photo设一个引用,这时就不用给photo设为全局变量了。

接下来改进代码:

import tkinter as tk from PIL import Image, ImageTk root = tk.Tk() root.wm_geometry("530x150+500+300") root.resizable(0, 0) imgs = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg'] def load_img(index,path): paned = tk.PanedWindow(root) paned.pack(fill=tk.X, side=tk.LEFT) img = Image.open(path) paned.photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小 tk.Label(paned, image=paned.photo).grid(row=index, column=0) for i in range(len(imgs)): load_img(i,imgs[i]) root.mainloop()

看出什么端倪了吗?

显示结果: 全部显示

--------------公布答案:

原代码:

photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小 tk.Label(paned, image=photo).grid(row=index, column=0)

将photo修改成paned.photo。

paned.photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小 tk.Label(paned, image=paned.photo).grid(row=index, column=0)

这时,photo的引用在paned身上。 这就是为什么要创建PanedWindow的原因,为了能够明白,可以理解成这样:

只要有paned在,那么photo的引用就一直在paned身上

这样所有图片都会显示啦!

那么,PhotoImage图片显示问题就完美解决了。

献上完整代码:

#!/usr/bin/python3 # coding=utf-8 import tkinter as tk from PIL import Image, ImageTk root = tk.Tk() root.wm_geometry("530x150+500+300") root.resizable(0, 0) imgs = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg'] def load_img(index,path): paned = tk.PanedWindow(root) paned.pack(fill=tk.X, side=tk.LEFT) img = Image.open(path) paned.photo = ImageTk.PhotoImage(img.resize((100, 130))) tk.Label(paned, image=paned.photo).grid(row=index, column=0) for i in range(len(imgs)): load_img(i,imgs[i]) root.mainloop()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有